PYTHON SULLEY HACKING War-ftpd
走过路过,不要错过这个公众号哦!
目 的
1
Sulley是一个使用PYTHON编写的模糊测试框架。与其他FUZZING测试软件相比,Sulley兼顾网络抓包,崩溃信息报告生成以及自动化VMWARE管理功能。
本次我们将部署Sulley,并且使用该框架对war-ftpd进行FUZZING测试,使学生快速体验到Sulley的强大之处。
知识
2
1、 Sulley的安装教程
1. 安装winpcap-4.12.exe。(用于抓取数据包)
2. 安装pcapy-0.10.5.win32-py2.7-winpcap4.1.2.exe(用于为抓包提供python接口)
3. 安装impacket-0.9.11.win32.msi(用于对数据包进行解码和构建)
4. 将sulley-master文件夹下的sulley,utils和requests文件夹放到c:\python27\lib\site-packages\目录下。(sulley核心文件)
5. 将pydbg_master资料中的四个文件夹放到c:\python27\lib\site-packages\目录下。其中utils文件夹和sulley的文件夹会重复,选择合并即可。(sulley使用部分pydbg模块)
6、测试。执行sulley文件夹下的network_monitor.py和process_monitor.py,如果不报错,则安装成功。
2、本次使用两台PC,均需要安装Sulley框架。被测试主机 IP 192.168.85.141, 测试主机 IP 192.168.85.151
具体步骤
3
war-ftpd这款ftp服务器在验证用户登陆时存在缓冲区溢出漏洞,本文我们将带小伙伴们使用Sulley这款Fuzzing测试框架来验证该漏洞的存在。具体思路如下:
1、 创建ftp fuzzing数据表示。
2、 创建网络监视器代理,进程监视器代理,测试。
3、 使用WEB访问监控,查看异常详情信息。
3.1 创建ftp fuzzing数据表示。
从步骤描述中提取到用户信息,ftp登陆漏洞。ftp登陆使用的是USER xxxx PASS xxxx模式来登陆。我们需要构造到的就是关于xxxx的畸形数据,并测试是否能够造成war-ftpd.exe异常。
Sulley中提供了多种数据表示。对于在测试中不需要变换的字符串,使用s_static函数即可。对于一般的需要变换的字符串,则使用s_string。对于像test@test.com这样的字符串,也可以进行细小化分割,可自定义分隔符,比如@符号和.符号,这时候使用的函数为s_delim()。对于分隔符的畸形数据包括重复,替换和删除。
举例来说,如果使用s_string(“hettian”),那么产生的数据包括了诸如”heetianAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA”等畸形数据。
用户在使用的过程中,不需要定义畸形行为,使用系统提供的畸形变换机制已经可以满足正常需求。
为了完成本次测试,我们需要对登陆过程中的账户名和密码进行FUZZING变换。编写ftp.py,内容如下。
首先我们初始化了两个变量user和pass(s_initialize),以供将来sulley框架调用。对于不变的数据使用了s_static,而对于需要变化的数据,则使用了s_string。这样,我们的数据将来可能是 USER hacker-fuzzing PASS hacker-fuzzing.(hacker-fuzzing 表示对应产生的fuzzing数据)。
编写完成后,将ftp.py放置到测试程序(ip 151)c:\python27\lib\site-packages\requests目录下以供将来测试使用。
3.2 创建网络监视器代理,进程监视器代理。
这一部分是Sulley测试框架的核心。测试主机并没有直接对被测试程序进行访问,而是通过中间代理来间接测试。通过进程监视代理可以查看进程的运行情况,网络监视代理又可以记录fuzzing测试过程中产生的流量。网络监视代理被硬编码为端口号26001,进程监视代理被硬编码为端口号26002.
下一步骤在被测试主机上设置(IP141)
1、 查看进程监视代理模块。切换到sulley_tools目录,执行process_monitor.py
-c参数:当目标测试程序发生异常时,所有现场信息都会记录到指定的文件中,等到测试结束之后我们可以从该文件中提取处所有的异常报告。
-p参数:进程代理需要指定目标测试程序的进程名,这样,进程代理通过进程名就可以找到该进程的PID值,从而起到监控的作用。
-port参数 指定进程代理监听端口。该端口是测试程序与进程代理的通信端口。默认设置26002,一般情况下我们无须修改。
进程监视模块运行在与目标测试程序war-ftpd.exe相同的系统下。根据我们的需要,若将异常文件定义为c:\war-ftpd.crash.那么在被测试系统上,则此脚本填充的参数如下图所示:
执行完成之后,下方列出了参数详情列表。可以看出,通过此项设置,远程测试程序可以与进程监控代理通信,而代理又通过程序名可以找到目标测试程序。这样间接的,就可以实现远程测试程序对目标程序的测试,而且还能记录下来所有的异常信息。当程序执行完毕之后,默认会打开26002端口进行监听。
输入 netstat –ano |find “26002”,可获得执行监听的程序PID。通过使用tasklist /fi “pid eq 1980”即可找到对应的进程名。(1980为对应的PID名,实验中可能不一样)
可以看到,运行着process_monitor.py的python.exe打开了26002端口进行监听。
2、 查看网络监控模块。切换到sulley目录,执行network_monitor.py
网络监控模块也是一个中间代理。测试程序发过来的数据包被监听到该模块用于记录。
-d参数:因为网络监控模块是对数据包的捕获,因此需要提供一个网络设备。
网络设备可以从最下方的Network Device List中获得。我们需要的是前方的索引号。在本例中,索引为0的网卡ip地址为192.168.85.141。
-f参数:定义了需要过滤的数据包类型,和wireshark的抓包过滤一致,使用的是BPF语法。通过定义该项,可以只记录感兴趣的数据包,以便后期分析整理。
-P参数:定义了将接收到的测试数据包存放在哪里。后面的路径在测试前必须存在。
网络监控模块默认监听端口为26001,这里我们不需要设置。
本次测试是针对ftp,因此应该将抓包过滤语法定义为“src or dst port 21”。在测试前,笔者创建了目录c:\war_ftp_pcaps。用于存放截取到的网络数据包。整条命令如下图所示:network_monitor.py –d 0 –f “src or dst port 21” –P c:\war_ftp_pcaps
这时候,网络监听模块开始等待请求。系统的26001端口也已经被打开。
3、 测试程序的编写,本步骤在测试主机(IP151上运行)
在两个监控程序都已经启动的情况下,我们来完成测试程序的编写,程序命名为ftp_session.py。
Ftp模块是我们在任务一中编写的ftp测试数据表示,它指明了我们将要怎样生成fuzzing数据。所以使用 from requests import ftp导出。
ftp在接入的时候ftp服务器会通过socket发送欢迎信息,我们需要对此进行接收处理,这就是receive_ftp_banner函数要做的是事情。
Session会话是指当程序出现异常并处理后,可以保证接着下一个测试用例进程测试。因此需要有文件记录,本实验中我们把它记录在audits目录下(实验前目录必须存在),文件名为
war2ftpd.session.
Target需要注册的信息有:
目标IP和端口,通过session.target添加
Target.netmon即对应的网络监控代理,通过pedrpc.client添加
Target.procmon即对应的进程监控代理,同样通过pedrpc.client添加。
Target.procmon_options中定义了目标程序名,通过{“proc_name”:”aim_name”}
此时target注册完毕。
在session部分,首先将receive_ftp_banner和属性pre_send绑定起来,这样在发送fuzzing数据之前就可以收到ftp欢迎信息。
通过s_get获得对应在ftp中命名的fuzzing变量以产生畸形字符串。
sess.connect()用于组合命令集。我们首先对user账户认证做了单独组合,又将账户和密码混合起来做了一次组合。
在最后使用sess.fuzz()即可开始fuzzing测试。
4、 部署测试环境。
首先在目标主机141上启动:network_monitor.py,process_monitor.py和war-ftpd.exe。
War-ftpd打开之后,点击闪电,打开服务,呈online状态。
接着在测试机151上需要启动:ftp_session.py即可。此时可以看到测试过程:
另一方面,在被测试主机141上,我们可以看到network.py记录了捕获到的数据包。
而process_monitor.py也开启了监控模式。
一小会之后,程序报错。在测试主机151上可以看到下列情况:
同时在141被测试主机上可以看到:
这时候war-ftpd.exe已经退出了。如果想要继续,那么重新打开war-ftpd.exe,开启ftp服务即可接着继续测试。
在实验过程中,如果出现长时间的异常,请关闭所有程序并重新执行操作。由于Sulley提供会话机制,所以整个测试会从上次断掉的地方重新开始。
3.3使用WEB访问监控,查看异常详情信息。
1、 一旦测试开始,测试主机(IP151)上会开启一个端口为26000的web服务。输入http://127.0.0.1:26000,可访问该页面。
友好的界面显示了测试过程。Total进度表示总进度,从图中可以看出我们在针对user进行fuzzing测试。两侧的pause按钮和resume按钮可以暂停和继续整个测试过程。
2、 点击testcase序号,进入详情。
可以看到,堆栈被A给填充以至于溢出了。Sulley使用的是pydbg框架,这里的测试报告和我们在pydbg教程中提到的一样。
3、 等到测试结束,或者不再想深入测试的时候,我们需要对现场信息整理。
我们可以看到,这些异常基本上都是同一种类型的异常。也没有必要再多测试几次了。
这时候,回到我们的测试主机(141)上来。网络监听代理已经将所有监听到的数据包都记录在了这里。并且这些数据包的编号和测试编号的大小一致。
如果测试用例比较多怎么办,如何筛选出来造成异常的数据包来重现攻击。Sulley为我们提供了一个工具叫做pcap_cleaner.py。
可以看到参数为 crash文件名和存放数据包的路径名。
我们记录的异常文件名为c:\war-ftpd.crash, 存放的数据包路径为c:\war_ftp_pcaps.
执行之后,我们来看下数据包目录。
可以看到,剩余的都是有效数据包,这些数据包的载荷能够使war-ftpd程序崩溃。
双击任意一个文件,wireshark会载入。我们以2为例。
右键跟随TCP流,查看会话。
可以看到,正是这段恶意填充的畸形数据A导致了缓冲区溢出。
4、 当测试结束之后,web界面无法打开,如果我们需要查看异常信息,可以使用命令行。Sulley提供给我们一个脚本 crashbin_explorer.py.
必选参数:异常文件名,可选参数 –t 异常序号,则显示该异常的详细信息。
输入crashbin_explorer.py c:\war-ftpd.crash.
效果和在web上一致。如果要查看2号的详细信息,后面再添加-t 2即可。由于文件较大,在命令行后加上 >a.txt,即可转存到a.txt中,方便我们查看(crashbin_explorer.py c:\war-ftpd.crash –t 2 >a.txt)
总结
4
本次我们使用Sulley这款Fuzzing测试框架验证了war-ftpd的ftp服务器在验证用户登陆时存在缓冲区溢出漏洞,其实Sulley还有其他的程序,读者可以自己查询下功能。希望本文能给大家带来一些启发,提高自身的实战动手能力。读者切记不要使用这些技术做违法的事情。如读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。
www.heetian.com
4006-123-731
长按图片,据说只有颜值高的才能识别哦~